gsk: Add GSK_RENDERING_MODE=full-redraw
authorBenjamin Otte <otte@redhat.com>
Mon, 26 Dec 2016 23:33:34 +0000 (00:33 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 26 Dec 2016 23:48:00 +0000 (00:48 +0100)
Forces a full redraw every frame.
This is done generically, so it's supported on every renderer.

For widget-factory first page (with the spinner spinning and progressbar
pulsing), I get these numbers per frame:

action                  clipped         full redraw
snapshot                   0ms           7-10ms
cairo rendering            0ms          10-15ms
Vulkan rendering         3-5ms          18-20ms
Vulkan expected *          0ms            1-2ms
GL rendering            unsupported     55-62ms

* expected means disabling rendering of unsupported render nodes,
instead of doing fallback drawing. So it overestimates the performance,
because borders and box-shadows are disabled.

gsk/gskdebug.c
gsk/gskdebugprivate.h
gsk/gskrenderer.c

index 3ccb5e0400ae622ce2a1a41212df02624fb3c08a..94d40b728c5fa0d5b41dc4708fafdd92df4edb4f 100644 (file)
@@ -18,6 +18,7 @@ static const GDebugKey gsk_rendering_keys[] = {
   { "geometry", GSK_RENDERING_MODE_GEOMETRY },
   { "shaders", GSK_RENDERING_MODE_SHADERS },
   { "sync", GSK_RENDERING_MODE_SYNC },
+  { "full-redraw", GSK_RENDERING_MODE_FULL_REDRAW},
   { "staging-image", GSK_RENDERING_MODE_STAGING_IMAGE },
   { "staging-buffer", GSK_RENDERING_MODE_STAGING_BUFFER }
 };
index 26b24f7e44edd145f06a3665b0611614e9eb750e..5a3f58d1500b072b197f6cc53ce091d63fc51d55 100644 (file)
@@ -21,8 +21,9 @@ typedef enum {
   GSK_RENDERING_MODE_GEOMETRY       = 1 << 0,
   GSK_RENDERING_MODE_SHADERS        = 1 << 1,
   GSK_RENDERING_MODE_SYNC           = 1 << 2,
-  GSK_RENDERING_MODE_STAGING_IMAGE  = 1 << 3,
-  GSK_RENDERING_MODE_STAGING_BUFFER = 1 << 4
+  GSK_RENDERING_MODE_FULL_REDRAW    = 1 << 3,
+  GSK_RENDERING_MODE_STAGING_IMAGE  = 1 << 4,
+  GSK_RENDERING_MODE_STAGING_BUFFER = 1 << 5
 } GskRenderingMode;
 
 gboolean gsk_check_debug_flags (GskDebugFlags flags);
index 623e395bc4e669e396109d0695148c32c7c12c89..bba01532c9df56f824776efb4e996705c50b7fb8 100644 (file)
@@ -916,7 +916,24 @@ gsk_renderer_begin_draw_frame (GskRenderer          *renderer,
   g_return_val_if_fail (region != NULL, NULL);
   g_return_val_if_fail (priv->drawing_context == NULL, NULL);
 
-  priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
+  if (GSK_RENDER_MODE_CHECK (FULL_REDRAW))
+    {
+      cairo_region_t *full_window;
+      
+      full_window = cairo_region_create_rectangle (&(GdkRectangle) {
+                                                       0, 0,
+                                                       gdk_window_get_width (priv->window),
+                                                       gdk_window_get_height (priv->window)
+                                                   });
+      
+      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, full_window);
+
+      cairo_region_destroy (full_window);
+    }
+  else
+    {
+      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
+    }
 
   return priv->drawing_context;
 }